package sd.settemmezzo.util;

import java.util.Vector;

import sd.settemmezzo.common.Player;
import sd.settemmezzo.player.state.GlobalState;
import sd.settemmezzo.player.state.LocalState;
import sd.settemmezzo.player.state.Deck.Carta;

public class Util {
	
	public static LocalState lstate = LocalState.getInstance();
	
	/* Elezione casuale del mazziere */
	public static Player scegliMazziere(Vector<Player> playersList) {
		int randomId = (int) (Math.random() * playersList.size());
		Player nuovoMazziere = playersList.get(randomId);
		return nuovoMazziere;
	}
	
	/* Elezione del leader con l'algoritmo del bullo */
	public static Player electBully(Vector<Player> playersList) {
		return playersList.lastElement();
	}
	
	/* Ritorna il punteggio di una determinata mano */
	public static float calcolaPunteggio(Vector<Carta> carte) {
		float punteggio = 0.0f;
		boolean matta = false;
		
		if (carte.size() == 2) {
			Carta first = carte.get(0);
			Carta second = carte.get(1);
			if (( 	// Ho un settemmezzo reale se ho due carte e...
					(first.getImage().startsWith("denari10") && second.getPunteggio() == 0.5f) ||
					(first.getImage().startsWith("denari10") && second.getPunteggio() == 7.0f) ||
					(first.getPunteggio() == 0.5f && second.getImage().startsWith("denari10")) ||
					(first.getPunteggio() == 7.0f && second.getImage().startsWith("denari10")) ||
					(first.getPunteggio() == 0.5f && second.getPunteggio() == 7.0f) ||
					(first.getPunteggio() == 7.0f && second.getPunteggio() == 0.5f))) {
				return 7.6f;
			}
		}
		
		for (Carta carta : carte) {
			if (!carta.getImage().startsWith("denari10")) {
				punteggio += carta.getPunteggio();
			} else {
				matta = true;
			}
		}
		
		if (matta) {
			if (punteggio == 7.0f) punteggio += 0.5f;
			else if (punteggio < 7.5f && (punteggio % 1) == 0) punteggio += (7.0f - punteggio);
			else if (punteggio < 7.5f && (punteggio % 1) == 0.5) punteggio += (7.5f - punteggio);
			else punteggio += 0.5f;
		}
		
		return punteggio;
	}
	
	/* Imposta il globalstate per il primo giro di una nuova mano */
	public static GlobalState carteCoperte(GlobalState gs) {
		Carta estrazione;
		gs.resetCarte();
		
		for (Player player : gs.getRing()) {
			if (gs.getSoldi(player.getId()) > 0) {
				estrazione = gs.getDeck().estraiCarta();
				gs.addCarta(player.getId(), estrazione);
			}
			gs.setPuntata(player.getId(), 0);
			gs.setPunteggio(player.getId(), 0.0f);
		}
		return gs;
	}
	
	/* Calcola se il mazziere vince o perde con un determinato giocatore */
	public static boolean doesMazziereWin(GlobalState gs, int avversarioId) {
		float puntiMazziere = gs.getPunteggio(gs.getMazziere().getId());
		float puntiAvversario = gs.getPunteggio(avversarioId);
		boolean result;
		
		if (puntiMazziere > 7.6f) puntiMazziere = -1.0f;
		if (puntiAvversario > 7.6f) puntiAvversario = -1.0f;
		
		if (puntiMazziere > puntiAvversario) result = true;
		else if (puntiMazziere < puntiAvversario) result = false;
		else if (puntiMazziere < 0 && puntiAvversario < 0) result = true;
		else {
			int carteMazziere = gs.getCarte(gs.getMazziere().getId()).size();
			int carteAvversario = gs.getCarte(avversarioId).size();
			if (carteMazziere >= carteAvversario) result = true;
			else result = false;
		}
		
		return result;
	}
	
	/* Effettua lo scambio di soldi tra mazziere e giocatore */
	public static void pay(int posta, int from, int to, GlobalState gstate) {
		if (gstate.getSoldi(from) < posta) {
			gstate.setSoldi(to, gstate.getSoldi(to) + gstate.getSoldi(from));
			gstate.setSoldi(from, 0);
		} else {
			gstate.setSoldi(to, gstate.getSoldi(to) + posta);
			gstate.setSoldi(from, gstate.getSoldi(from) - posta);
		}
	}

}
